<?php
require_once('includes/clases/Horario.php');
require_once('includes/clases/Grupo.php');
require_once('includes/clases/ConstantesCargaAcademica.php');
require_once('includes/clases/Logger.php');
require_once('includes/clases/HorarioProfesor.php');

class AccesoDatosCargaAcademica{
	private $logger = null;

	function __construct( $logger=null ) {
		if( $logger == null ){
			$this->logger = new Logger();
		}else{
			$this->logger = $logger;
		}
	}

	static function conexion(){
        $con=mysqli_connect('localhost', 'root', null, 'ggrupos',null,null);
        // Check connection
        if (mysqli_connect_errno())
        {
            $this->logger->log( "Fallo la conexion a la base de datos: " . mysqli_connect_error() , Logger::$ERROR );
        }
        return $con;
    }

    function guardarGrupo( $grupo ){
    	if( $this->validarExisteGrupo( $grupo ) ){
    		$this->logger->log("Ya existe el grupo $grupo->grupo");
    		$grupo->id = $this->db_obtener_grupo( $grupo );
            if( $this->db_remueve_profesor( $grupo ) == 1 ){
                $this->logger->log("Se desasigna el profesor al grupo existente");
            }
    	} else{
    		$this->logger->log("Creando Grupo");
    	 	$this->insertarGrupo( $grupo );	
    	}
    }

    function insertarGrupo( $grupo ){
    	if( $this->db_insertar_grupo( $grupo ) == 1 ){
    		$grupo->id = $this->db_obtener_grupo( $grupo );
    	}
    }
    
    function guardarHorarios( $horarios ){
    	$arrlength = count( $horarios );
    	for( $x=0; $x < $arrlength; $x++ ){
			$horario = $horarios[$x];
			$this->guardarHorario( $horario );
			$this->logger->log( $horario->display(), Logger::$INFO );
		}
	}

	function guardarHorario( $horario ){
    	$this->logger->log("Creando Horario");
    	$this->insertarHorario( $horario );
    }

    function insertarHorario( $horario ){
    	if( $this->db_insertar_horario( $horario ) == 1 ){
    		$this->logger->log( "horario insertado" , Logger::$INFO );
    	}
    }

    function validarExisteGrupo( $grupo ){
    	return is_numeric( $this->db_obtener_grupo( $grupo ) );
    }

    function borrarHorariosDelGrupo( $grupo ){
    	$result = $this->db_eliminar_horarios_by_grupo( $grupo->id );
    	return $result;
    }

    function liberarRecursos(& $result ){
        $result->close();
    }

    function db_obtener_id_uea_by_clave( $clave ){
        $result = mysqli_query( self::conexion(), "SELECT id FROM ueas WHERE clave = $clave" );
        $row = $result->fetch_row();
        $this->liberarRecursos( $result );
        return $row[0];
    }

    function db_obtener_id_grupo_by_trimestre( $idTrimestre ){
        $result = mysqli_query( self::conexion(), "SELECT id FROM grupos WHERE trimestre = $idTrimestre" );
        $row = $result->fetch_row();
        $this->liberarRecursos( $result );
        return $row[0];
    }

    function db_insertar_grupo( $grupo ){
        $result = mysqli_query( self::conexion(), "INSERT INTO grupos (grupo, uea, trimestre) VALUES ('$grupo->grupo', '$grupo->uea', '$grupo->trimestre')" );
        return $result;
    }

    function db_obtener_grupo( $grupo ){
        $result = mysqli_query( self::conexion(), "SELECT id FROM grupos WHERE grupo = '$grupo->grupo' AND uea =  '$grupo->uea' AND trimestre = '$grupo->trimestre'" );
        $row = $result->fetch_row();
        $this->liberarRecursos( $result );
        return $row[0];
    }

    function db_obtener_grupo_by_trimestre( $idTrimestre ){
        $result = mysqli_query( self::conexion(), "SELECT * FROM grupos WHERE grupos.trimestre = $idTrimestre" );
        return $this->fetch_all_grupos( $result );
    }

    function db_obtener_horarios_by_grupo( $idGrupo ){
        $result = mysqli_query( self::conexion(), "SELECT * FROM horarios WHERE horarios.grupo = $idGrupo" );
        return $this->fetch_all_horarios( $result );
    }

    function db_obtener_horarios_profesores_for_grupo( $idGrupo ){
        $result = mysqli_query( self::conexion(), "SELECT ch.profesor, ch.inicio, ch.fin, ch.dia " .
												  	"FROM catalogo_horarios ch, catalogo_ueas cueas, grupos g " .
													"WHERE g.id = $idGrupo " .
													"AND ch.profesor = cueas.profesor " .
													"AND g.uea = cueas.uea " .
													"AND ch.dia " .
													"IN ( SELECT dia " .
															"FROM horarios " .
															"WHERE grupo = $idGrupo ) " .
													"ORDER BY ch.profesor" );
        return $this->fetch_horarios_profesores( $result );
    }

    function db_insertar_horario( $horario ){
        $result = mysqli_query( self::conexion(), "INSERT INTO horarios (grupo, inicio, fin, dia, salon) VALUES ('$horario->grupo', '$horario->inicio', '$horario->fin', '$horario->dia', '$horario->salon')" );
        return $result;
    }

    function db_eliminar_horarios_by_grupo( $idGrupo ){
        $result = mysqli_query( self::conexion(), "DELETE FROM horarios WHERE grupo = '$idGrupo'" );
        return $result;
    }

    function db_asignar_profesor_a_grupo( $grupo ){
        $result = mysqli_query( self::conexion(), "UPDATE grupos SET profesor = $grupo->profesor WHERE id = $grupo->id" );
        return $result;
    }

    function db_remueve_profesor( $grupo ){
        $result = mysqli_query( self::conexion(), "UPDATE grupos SET profesor = NULL WHERE id = $grupo->id" );
        return $result;   
    }

    function db_asignar_profesor_grupo_temporal( $grupo, $horario ){
        $result = mysqli_query( self::conexion(), "INSERT INTO horariosasignadosprofesor (inicio, fin, dia, profesor) VALUES ('$horario->inicio', '$horario->fin', '$horario->dia', '$grupo->profesor')" );
        return $result;
    }

    function db_eliminar_horario_profesor_temporal(){
        $result = mysqli_query( self::conexion(), "DELETE FROM horariosasignadosprofesor" );
        return $result;
    }

    function db_tiene_asignacion_profesor_grupo_temporal_en_horario( $idProfesor, $horario ){
        $result = mysqli_query( self::conexion(), "SELECT COUNT( * ) " .
                                                    "FROM horariosasignadosprofesor " .
                                                    "WHERE dia = $horario->dia " .
                                                    "AND profesor = $idProfesor " .
                                                    "AND ( " . 
                                                    "( '$horario->inicio' <= inicio AND fin <= '$horario->fin' AND inicio <= fin ) OR " .
                                                    "( '$horario->inicio' <= inicio AND '$horario->fin' <= fin AND inicio <= '$horario->fin'  ) OR " .
                                                    "( inicio <= '$horario->inicio' AND '$horario->fin' <= fin AND '$horario->inicio' <= '$horario->fin' ) OR " .
                                                    "( inicio <= '$horario->inicio' AND fin <= '$horario->fin' AND '$horario->inicio' <= fin  )" .
                                                       " )");
        $row = $result->fetch_row();
        $this->liberarRecursos( $result );
        return $row[0];
    }

    function fetch_all_grupos(& $result ) {
        // Args :    $result = mysqli result variable (passed as reference to allow a free() at the end
        // Returns : associative array indexed by the keys array
        $grupos = array();             // The array we're going to be returning
        while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
            $grupo = new Grupo();
            $grupo->convertir( $row );
            $grupos[] = $grupo;
        }
        /* free result set */
        $result->close();
        return($grupos);               
    }

    function fetch_all_horarios(& $result ) {
        // Args :    $result = mysqli result variable (passed as reference to allow a free() at the end
        // Returns : associative array indexed by the keys array
        $horarios = array();             // The array we're going to be returning
        while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
            $horario = new Horario();
            $horario->convertir( $row );
            $horarios[] = $horario;
        }
        /* free result set */
        $result->close();
        return($horarios);               
    }

    function fetch_horarios_profesores(& $result){
    	// Args :    $result = mysqli result variable (passed as reference to allow a free() at the end
        // Returns : associative array indexed by the keys array
        $horariosProfesores = array();             // The array we're going to be returning
        while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
            $horarioProfesor = new HorarioProfesor();
            $horarioProfesor->convertir( $row );
            $horariosProfesores[] = $horarioProfesor;
        }
        /* free result set */
        $result->close();
        return($horariosProfesores);	
    }
}
?>